import { isArray } from '/@/utils/is';
import { replaceProps } from '../utils/enhancedUtils';
export function useValidateRules(args) {
    const { data } = args;
    const col = args.col;
    let rules = [];
    if (isArray(col.validateRules)) {
        for (let rule of col.validateRules) {
            let replace = {
                message: replaceProps(col, rule.message),
            };
            if (rule.unique || rule.pattern === 'only') {
                // 唯一校验器
                rule.validator = uniqueValidator(args);
            }
            else if (rule.pattern) {
                // 非空
                if (rule.pattern === fooPatterns[0].value) {
                    rule.required = true;
                    delete rule.pattern;
                }
                else {
                    // 兼容Online表单的特殊规则
                    for (let foo of fooPatterns) {
                        if (foo.value === rule.pattern) {
                            rule.pattern = foo.pattern;
                            break;
                        }
                    }
                }
            }
            else if (typeof rule.handler === 'function') {
                // 自定义函数校验
                rule.validator = handlerConvertToValidator;
            }
            rules.push(Object.assign({}, rule, replace));
        }
    }
    data.innerEditRules[col.key] = rules;
}
/** 唯一校验器 */
function uniqueValidator({ methods }) {
    return function (event) {
        const { cellValue, column, rule } = event;
        let tableData = methods.getTableData();
        let findCount = 0;
        for (let rowData of tableData) {
            if (rowData[column.params.key] === cellValue) {
                if (++findCount >= 2) {
                    return Promise.reject(new Error(rule.message));
                }
            }
        }
        return Promise.resolve();
    };
}
/** 旧版handler转为新版Validator */
function handlerConvertToValidator(event) {
    const { column, rule } = event;
    return new Promise((resolve, reject) => {
        rule.handler(event, (flag, msg) => {
            let message = rule.message;
            if (typeof msg === 'string') {
                message = replaceProps(column.params, msg);
            }
            if (flag == null) {
                resolve(message);
            }
            else if (!!flag) {
                resolve(message);
            }
            else {
                reject(new Error(message));
            }
        });
    });
}
// 兼容 online 的规则
const fooPatterns = [
    { title: '非空', value: '*', pattern: /^.+$/ },
    { title: '6到16位数字', value: 'n6-16', pattern: /^\d{6,16}$/ },
    { title: '6到16位任意字符', value: '*6-16', pattern: /^.{6,16}$/ },
    { title: '6到18位字母', value: 's6-18', pattern: /^[a-z|A-Z]{6,18}$/ },
    //update-begin-author:taoyan date:2022-6-1 for: VUEN-1160 对多子表，网址校验不正确
    {
        title: '网址',
        value: 'url',
        pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/,
    },
    //update-end-author:taoyan date:2022-6-1 for: VUEN-1160 对多子表，网址校验不正确
    { title: '电子邮件', value: 'e', pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/ },
    { title: '手机号码', value: 'm', pattern: /^1[3456789]\d{9}$/ },
    { title: '邮政编码', value: 'p', pattern: /^[1-9]\d{5}$/ },
    { title: '字母', value: 's', pattern: /^[A-Z|a-z]+$/ },
    { title: '数字', value: 'n', pattern: /^-?\d+(\.?\d+|\d?)$/ },
    { title: '整数', value: 'z', pattern: /^-?\d+$/ },
    {
        title: '金额',
        value: 'money',
        pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,5}))$/,
    },
];
